﻿#pragma once

#include "precomp.h"
#include "game_object.h"
#include "renders.h"
#include "patterns.h"
#include "effect.h"
#include "global_state.h"

const unsigned int MAX_BULLETS=20000;

class Appearance;
class Behaviour;
struct Pattern;

struct PatternControl {
	PatternControl();
	~PatternControl();
	char kill_bullet; // уничтожить пулю по сигналу
	char change_speed;
	char change_direction;
	char rotate;
	char change_start_position;
	char change_appearance;
	char change_behaviour;
	char spawn_bullets;
	CL_SharedPtr<float> c_params;
};

class Bullet : public GameObject {
public:
	Bullet();
	~Bullet();
	CL_Vec2<float> direction;
	CL_Vec2<float> start_position;
	CL_Angle orientation;
	float speed;
	float time_lived;
	float param_float1;
	float start_param_float1;
	unsigned int id;
	char active;
	char appearance_index; // Индекс в массиве однотипных отображений(например, разные цвета)
	char owner;  // Кто выпустил пулю. 0 - игрок, 1 - противник
	char use_pattern; // Проиводятся ли действия над пулей по сигналу паттерна
	char grazed; // 0 - прогрейзена, 1 - нет
	char is_lazor;
	char blown;
	unsigned int damage;
	int trigger; // Для синхронизации с паттерном
	PatternControl pc;
	Appearance *appearance;
	Behaviour *behaviour;
	Pattern *pattern;
public:
	void Render(CL_GraphicContext &gc);
	void Update(float time);
	void LaunchPatternControl();
	void CalculateDirection();
};


class BulletManager {
private:
	Bullet *bullets;
	unsigned int *id_index_table;
	unsigned int active_bullets_count;
	unsigned int next_free_id_slot;
	float damage_sound_time;
public:
	BulletManager();
	~BulletManager();
	unsigned int Create(Bullet &p_bullet_description);

	int CollidePlayer();
	int CollideEnemy(GameObject *e);
	void CancelBullets(GameObject *canceller); // Уничтожить пули после смерти игрока
	void CancelBossBullets(int spellwork); // Собрать очки со всех пуль босса на экране
	void GrazeBullets(float time);
	void BlowBullets(GameObject *p, float time);
	void BlowBulletsBomb(float time);

	void Update(float time);
	void Render(CL_GraphicContext &gc, CL_Rect &clip, int who);
	void Clear();
    Bullet* GetBulletByID(unsigned int p_id);
};

extern BulletManager bmanager;
